package elm.service;

import elm.dao.BusinessDao;
import elm.dao.OrderDao;
import elm.dao.UserDao;
import elm.entity.po.Business;
import elm.entity.po.Order;
import elm.entity.po.User;
import elm.entity.po.vo.OrderRequest;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;

/**
 * 订单服务类
 * 提供订单创建的核心业务逻辑，包含：
 * - 请求参数校验
 * - 用户与商家信息加载
 * - 订单实体构建与持久化
 */
@Service
public class OrderService {
    @Resource
    private BusinessDao businessDao;
    @Resource
    private UserDao userDao;
    @Resource
    private OrderDao orderDao;

    /**
     * 创建新订单
     * 根据前端传入的订单请求对象创建订单记录，包含完整的业务校验和数据转换逻辑
     *
     * @param orderRequest 包含订单创建所需参数的请求对象
     * @return 已成功保存至数据库的订单实体对象
     * @throws IllegalArgumentException 当必要参数缺失时抛出异常
     * @throws RuntimeException         当关联用户或商家不存在时抛出异常
     */
    @Operation(
        summary = "创建订单",
        description = "根据提供的订单请求对象创建新的订单记录，自动关联用户和商家信息"
    )
    public Order createOrder(
            @Parameter(
                description = "订单创建请求对象，包含用户ID、商家ID、订单金额等核心字段",
                required = true
            ) OrderRequest orderRequest) {

        // 参数校验：确保关键外键存在
        if (orderRequest.getUserId() == null || orderRequest.getBusinessId() == null) {
            throw new IllegalArgumentException("用户ID和商家ID不能为空");
        }

        // 加载关联实体：用户
        User user = userDao.findById(orderRequest.getUserId())
                .orElseThrow(() -> new RuntimeException("用户不存在"));

        // 加载关联实体：商家
        Business business = businessDao.findById(orderRequest.getBusinessId())
                .orElseThrow(() -> new RuntimeException("商家不存在"));

        // 构建订单实体
        Order order = new Order();
        order.setUser(user);
        order.setBusiness(business);
        order.setTotalPrice(orderRequest.getTotalPrice());
        order.setDeliveryFee(orderRequest.getDeliveryFee());
        order.setStatus(orderRequest.getStatus()); // 自动将字符串转换为OrderStatus枚举
        order.setCreatedAt(orderRequest.getCreatedAt());

        // 保存并返回持久化后的订单对象
        return orderDao.save(order);
    }
}
